﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using HerGoS.Viaticos.Entities;
using HerGoS.Viaticos.Engine;
using HerGoS.ControlsUI;

namespace HerGoS.WebUI.Viaticos.Liquidaciones
{
    public partial class Impresion : System.Web.UI.Page
    {
        protected object GetCantidadTerminales()
        {
            return Eval("CantidadTerminales");
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            this.btnImprimir.Settings(new ButtonExtText());
            if (Request.QueryString["id"] != null)
            {
                var Id = Convert.ToInt32(Request.QueryString["id"]);

                Liquidacion liquidacion = GestorLiquidacion.Obtener(Id);

                this.lblfechaLiquidacion.Text = DateTime.Now.ToShortDateString();
                lblNumeroLiquidacion.Text = liquidacion.NumeroLiquidacion.ToString();
                lblApellidoyNombrePasajero.Text = liquidacion.SolicitudLiquidada.Persona.NombresYApellidos;


                List<ReporteGastos> listaReporteGastos = new List<ReporteGastos>();
                List<ReporteGastos> listaGastos = new List<ReporteGastos>();

                List<ReporteGastos> listaDefinitivaGatos = new List<ReporteGastos>();

                decimal totalSeccionI = 0;

                if (liquidacion.Tramos.Count > 0)
                {
                     // verifico si no existen gastos terminales. 
                   // var result = liquidacion.Tramos.Where(y => y.AnularMontoTerminalOrigenIda && y.AnularMontoTerminalDestinoIda);

                    var ultimotramo =  liquidacion.Tramos.Last();

              
                    ReporteGastos reporteGastoTerminal2 = new ReporteGastos();
                    var concepto = new HerGoS.Viaticos.Entities.TipoConcepto { OID = 1, Codigo = "1", Descripcion = "Gastos Terminales" };
                    reporteGastoTerminal2.Fecha = ultimotramo.FechaDestino.Value.ToShortDateString();
                    reporteGastoTerminal2.Concepto = concepto;
                    reporteGastoTerminal2.CantidadTerminales = liquidacion.CantidadTerminales;
                    reporteGastoTerminal2.Monto = liquidacion.TotalTerminales.ToString("N2");
                    if (liquidacion.CantidadTerminales == 0)
                    {
                        reporteGastoTerminal2.Valor = String.Format("{0:0.00}", 0);

                    }
                    else
                    {
                        reporteGastoTerminal2.Valor = String.Format("{0:0.00}", liquidacion.TotalTerminales / liquidacion.CantidadTerminales);
                    }
                        listaReporteGastos.Add(reporteGastoTerminal2);

                    
//VEHÍCULO PARTICULAR
//Fecha Gasto: La del día que inicia el viaje
//Tipo Concepto: Km recorridos
//Cant. Km: Sumatoria de todos los tramos
//Valor: Precio x km (parametrizado en Viaticos)
//Monto: cant km x valor

                //var result = liquidacion.Tramos.FindAll(y => y.Transporte.CALCULOKMS && y.Transporte.Activo);


                  
                   var primerTramo =  liquidacion.Tramos.First();


                     if (liquidacion.CantidadKms > 0)
                    {
                        ReporteGastos reporteKilometros = new ReporteGastos();
                        var conceptoKm = new HerGoS.Viaticos.Entities.TipoConcepto { OID = -1, Codigo = "-1", Descripcion = "Kilometros Recorridos" };
                        reporteKilometros.Concepto = conceptoKm;
                        reporteKilometros.CantidadKm = liquidacion.CantidadKms;
                        reporteKilometros.Fecha = primerTramo.FechaOrigen.Value.ToShortDateString();
                          List<TarifaKmRecorridos> lista =  GestorTarifaKmRecorridos.Consultar();
                         if (lista != null)
                            reporteKilometros.Valor = String.Format("{0:0.00}", lista[0].Montokm);
                        
                        reporteKilometros.Monto = String.Format("{0:0.00}", liquidacion.TotalKmRecorridos);

                        listaReporteGastos.Add(reporteKilometros);
                    }
                    if (liquidacion.LGastos.Count > 0)
                    {
                        listaGastos = liquidacion.LGastos.Select(x => new ReporteGastos
                                                         {
                                                             Fecha = x.FechaGasto.Value.ToShortDateString(),
                                                             Concepto = x.TipoConcepto,
                                                             Valor = String.Format("{0:0.00}",x.MontoGasto), 
                                                             Monto = String.Format("{0:0.00}",x.MontoGasto),
                                                             CantidadTerminales =1

                                                         }).ToList();

                    }

                    listaDefinitivaGatos = listaReporteGastos.Union(listaGastos).ToList();

                    GridReporteGastos.DataSource = listaDefinitivaGatos;
                    GridReporteGastos.DataBind();

                     totalSeccionI = liquidacion.TotalTerminales + liquidacion.TotalKmRecorridos + liquidacion.TotalGastos;

                    this.lblTotalSeccionI.Text = totalSeccionI.ToString("N2");

                    CalculoViaticos calc = GestorViaticos.CalcularVitaticos(liquidacion);

                     
                    List<TramosReporte> listaTramoReporte = new List<TramosReporte>();
                   
                    var indiceUltimo = liquidacion.Tramos.Count - 1;

                    for (int i = 0; i <= liquidacion.Tramos.Count - 1; i++)
                      {

                        var tramoReporte = new TramosReporte();
                       
                            tramoReporte.Partida = "Partida";
                            tramoReporte.Ciudad = liquidacion.Tramos[i].CiudadOrigen.Nombre;
                            tramoReporte.ModoViaje = liquidacion.Tramos[i].Transporte.Descripcion;
                            tramoReporte.Fecha = liquidacion.Tramos[i].FechaOrigen.Value.ToShortDateString();
                            tramoReporte.Hora = liquidacion.Tramos[i].FechaOrigen.Value.ToString("HH:mm");
                            //tramoReporte.MontoDiario = String.Format("{0:0.00}", 0); // tarifa diaria destino.
                            tramoReporte.Monto = String.Format("{0:0.00}", 0);
                            tramoReporte.CantidadDias = 0;
                           

                             listaTramoReporte.Add(tramoReporte);

                            var tramoReporteLLegada = new TramosReporte();

                            tramoReporteLLegada.Partida = "Llegada";
                            tramoReporteLLegada.Ciudad = liquidacion.Tramos[i].CiudadDestino.Nombre;
                            tramoReporteLLegada.ModoViaje = liquidacion.Tramos[i].Transporte.Descripcion;
                            tramoReporteLLegada.Fecha = liquidacion.Tramos[i].FechaDestino.Value.ToShortDateString();
                            tramoReporteLLegada.Hora = liquidacion.Tramos[i].FechaDestino.Value.ToString("HH:mm");
                            tramoReporteLLegada.PorcentajeViatico = liquidacion.Tramos[i].PorcentajeViatico/100;
                            
                            decimal montoDiario = 0;
                            if (indiceUltimo == i)
                            {
                                tramoReporteLLegada.MontoDiario = String.Format("${0:0.00}", liquidacion.Tramos[i - 1].TarifaDiariaDestino);
                                montoDiario = liquidacion.Tramos[i - 1].TarifaDiariaDestino;
                                if (calc.Medioviatico)
                                {
                                    //tramoReporteLLegada.CantidadDias = 0.5M;
                                    tramoReporteLLegada.CantidadDias = liquidacion.Tramos[indiceUltimo].DiasViaticos; 
                                }
                                else
                                {
                                    //tramoReporteLLegada.CantidadDias = 0;
                                    tramoReporteLLegada.CantidadDias = liquidacion.Tramos[indiceUltimo].DiasViaticos;
                                    if (tramoReporteLLegada.CantidadDias == 0)
                                    {
                                        tramoReporteLLegada.MontoDiario = string.Empty;
                                    }
                                }

                            }
                            else
                            {
                                tramoReporteLLegada.CantidadDias = calc.DiasViaticosTramos[i];
                                if (tramoReporteLLegada.CantidadDias > 0)
                                {
                                    montoDiario = liquidacion.Tramos[i].TarifaDiariaDestino;
                                    tramoReporteLLegada.MontoDiario = String.Format("${0:0.00}", montoDiario);
                                }
                                
                            }

                            decimal montoTotal = tramoReporteLLegada.CantidadDias * montoDiario * (liquidacion.Tramos[i].PorcentajeViatico / 100);

                              tramoReporteLLegada.Monto = String.Format("{0:0.00}", montoTotal);
                           
                         

                           listaTramoReporte.Add(tramoReporteLLegada);             

			          }




                    GridReporteTramos.DataSource = listaTramoReporte;
                    GridReporteTramos.DataBind();
                }

                List<ReporteAnticipo> Anticipos = new List<ReporteAnticipo>();
                 var anticipo = GestorLiquidacion.TraerAnticipo(liquidacion.SolicitudLiquidada);
                 if (anticipo != null)
                 {
                     var reporteAnticipo = new ReporteAnticipo()
                                           {
                                               FechaAnticipo = anticipo.FechaLiquidacion.Value.ToShortDateString(),
                                               MontoAnticipo = String.Format("{0:0.00}", anticipo.TotalAPagar),
                                               NumeroCheque = anticipo.NumeroCheque
                                           };

                     Anticipos.Add(reporteAnticipo);
                 }
                 else
                 {
                     var reporteAnticipo = new ReporteAnticipo()
                                             {
                                                 FechaAnticipo = string.Empty,
                                                 MontoAnticipo = String.Format("{0:0.00}", 0),
                                                 NumeroCheque = String.Format("{0:0.00}", 0)
                                             };

                     Anticipos.Add(reporteAnticipo);
                 }

                GridReporteAnticipo.DataSource = Anticipos;
                GridReporteAnticipo.DataBind();

                lblObservacion.Text = liquidacion.Observaciones;
                //lblReporteTotalGastos.Text = String.Format("{0:0.00}", totalSeccionI);

                lblReporteTotalGastos.Text = totalSeccionI.ToString("N2");

                lblReporteTotalMontoViatico.Text = liquidacion.TotalViaticos.ToString("N2");
                lblTotalSeccionII.Text = liquidacion.TotalViaticos.ToString("N2");


                this.lblTotalSeccionIII.Text = liquidacion.AnticiposLiquidados.ToString("N2");

                lblReporteTotalAnticipo.Text = liquidacion.AnticiposLiquidados.ToString("N2");
                lblReporteTotal.Text = liquidacion.TotalAPagar.ToString("N2");



            }
        }

        protected void GridReporteTramos_SelectedIndexChanged(object sender, EventArgs e)
        {

        }
    }
}